/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.mantenimiento</code> agrupa todas las
 * interfaces, clases y elementos de la GUI para la gestión del subsistema 
 * de Mantenimiento
 */
package edu.uoc.tds.pec4.mantenimiento;

import edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface;
import edu.uoc.tds.pec4.beans.AuditoriaDTO;
import edu.uoc.tds.pec4.beans.EquipamientoDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.common.validation.ValidarGUI;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorMantenimientoException;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Enumeration;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.WindowConstants;

/**
 * La clase <code>DialogAltaEquipamiento</code> representa la interfaz de
 * usuario para el alta de un equipamiento.<br />
 *
 * Interficie de usuario para el alta de equipamientos.
 *
 * @author	Luis Rivas Mariño
 * @version	04/12/2011
 * @see		edu.uoc.tds.pec4.common.GestorMantenimientoInterface
 */
public class DialogAltaEquipamiento extends JDialog {

    /** Componentes del formulario */
    private JTextField nombre;
    private JButton btnCancelar;
    private JButton btnConfirmar;
    private JLabel lblNombre;
    private JLabel lblPrecioDia;
    private JLabel lblPrecioHora;
    private JPanel panelBotones;
    private JPanel panelDatos;
    private JPanel panelPrecio;
    private JTextField precioDia;
    private JTextField precioHora;
    private JRadioButton rBtnAsistente;
    private JRadioButton rBtnEspacio;
    private ButtonGroup btnGPrecio;
    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto es el objeto empleado como interfaz en la comunicación RMI */
    private GestorMantenimientoInterface objRemotoMantenimiento = null;
    // Identificador del usuario conectado
    private String idConectado;

    /** Crea un nuevo formulario DialogAltaEquipamiento */
    public DialogAltaEquipamiento(Frame parent, boolean modal, UsuarioDTO usLogeado) {

        super(parent, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.titulo"), modal);

        conectarCliente();

        inicializarComponentes();

        // Obtenemos el usuario 
        idConectado = usLogeado.getIdUsuario();

        //Centramos la ventana en la pantalla
        UtilidadesGUI.centrarVentana(this);

    }

    /** Este método es llamado desde el constructor para 
     *  inicializar el formulario.
     */
    private void inicializarComponentes() {

        panelBotones = new JPanel();
        btnConfirmar = getBtnConfirmar();
        btnCancelar = getBtnCancelar();
        panelPrecio = new JPanel();
        rBtnEspacio = new JRadioButton();
        rBtnAsistente = new JRadioButton();
        precioDia = new JTextField();
        precioHora = new JTextField();
        lblPrecioDia = new JLabel();
        lblPrecioHora = new JLabel();
        panelDatos = new JPanel();
        nombre = new JTextField();
        lblNombre = new JLabel();
        btnGPrecio = new ButtonGroup();

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        btnConfirmar.setText(TDSLanguageUtils.getMessage("mantenimiento.gui.boton.aceptar"));
        btnCancelar.setText(TDSLanguageUtils.getMessage("mantenimiento.gui.boton.cancelar"));

        GroupLayout panelBotonesLayout = new GroupLayout(panelBotones);
        panelBotones.setLayout(panelBotonesLayout);
        panelBotonesLayout.setHorizontalGroup(
                panelBotonesLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, panelBotonesLayout.createSequentialGroup().addContainerGap(122, Short.MAX_VALUE).addComponent(btnConfirmar).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(btnCancelar).addGap(106, 106, 106)));
        panelBotonesLayout.setVerticalGroup(
                panelBotonesLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(panelBotonesLayout.createSequentialGroup().addContainerGap().addGroup(panelBotonesLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(btnConfirmar).addComponent(btnCancelar)).addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        panelPrecio.setBorder(BorderFactory.createTitledBorder(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.panel.precio")));
        btnGPrecio.add(rBtnEspacio);
        rBtnEspacio.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.seleccion.espacio"));
        btnGPrecio.add(rBtnAsistente);
        rBtnAsistente.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.seleccion.asistente"));
        precioDia.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        precioHora.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        lblPrecioDia.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.etiqueta.preciodia"));
        lblPrecioHora.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.etiqueta.preciohora"));

        GroupLayout panelPrecioLayout = new GroupLayout(panelPrecio);
        panelPrecio.setLayout(panelPrecioLayout);
        panelPrecioLayout.setHorizontalGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(panelPrecioLayout.createSequentialGroup().addContainerGap().addGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(rBtnEspacio).addComponent(rBtnAsistente)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 94, Short.MAX_VALUE).addGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(lblPrecioDia).addComponent(lblPrecioHora)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).addComponent(precioHora).addComponent(precioDia, GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE)).addContainerGap()));
        panelPrecioLayout.setVerticalGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(panelPrecioLayout.createSequentialGroup().addGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(rBtnEspacio).addComponent(precioDia, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(lblPrecioDia)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup(panelPrecioLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(rBtnAsistente).addComponent(precioHora, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(lblPrecioHora))));

        panelDatos.setBorder(BorderFactory.createTitledBorder(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.panel.datos")));

        lblNombre.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.etiqueta.nombre"));

        GroupLayout panelDatosLayout = new GroupLayout(panelDatos);
        panelDatos.setLayout(panelDatosLayout);
        panelDatosLayout.setHorizontalGroup(panelDatosLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, panelDatosLayout.createSequentialGroup().addContainerGap().addComponent(lblNombre).addGap(51, 51, 51).addComponent(nombre, GroupLayout.DEFAULT_SIZE, 293, Short.MAX_VALUE).addContainerGap()));
        panelDatosLayout.setVerticalGroup(panelDatosLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(panelDatosLayout.createSequentialGroup().addGroup(panelDatosLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(nombre, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(lblNombre)).addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(panelDatos, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(panelPrecio, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(panelBotones, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addContainerGap()));
        layout.setVerticalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(panelDatos, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(panelPrecio, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(panelBotones, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)));

        pack();
    }

    /**
     * Conectar con el servidor RMI
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoMantenimiento = (GestorMantenimientoInterface) Naming.lookup("GestorMantenimiento");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    private JButton getBtnConfirmar() {
        if (btnConfirmar == null) {
            btnConfirmar = new JButton();
            btnConfirmar.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.boton.aceptar"));
            btnConfirmar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    try {
                        btnConfirmarActionPerformed(e);
                    } catch (RemoteException eRe) {
                        JOptionPane.showMessageDialog(null,
                                eRe.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.equipamiento.alta"),
                                JOptionPane.ERROR_MESSAGE);
                    } catch (GestorMantenimientoException gmE) {
                        JOptionPane.showMessageDialog(null,
                                gmE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.err.equipamiento.alta"),
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
        }
        return btnConfirmar;
    }

    /**
     * Realiza el alta de un equipamiento en la base de datos
     * @param e evento del botón
     * @throws RemoteException
     * @throws GestorMantenimientoException 
     */
    private void btnConfirmarActionPerformed(ActionEvent e) throws RemoteException, GestorMantenimientoException {

        if (nombre.getText().equals("")) {
            JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.sindatos"));
        } else {
            // Comprobación de los precios introducidos
            if (!ValidarGUI.isDouble(precioDia.getText())) {
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.err.decimal"));
                precioDia.setText("");
                return;
            }

            if (!ValidarGUI.isDouble(precioHora.getText())) {
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.err.decimal"));
                precioHora.setText("");
                return;
            }

            if (!ValidarGUI.compruebaPrecios(precioDia.getText(), precioHora.getText())) {
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.comprueba.precios"));
            } else {
                //Comprobación de si se ha seleccionado algún tipo de precio
                if (!(rBtnAsistente.isSelected() || rBtnEspacio.isSelected())) {
                    JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.sindatos"));
                } else {
                    try {
                        AuditoriaDTO auditoria = new AuditoriaDTO();
                        EquipamientoDTO equipamiento = new EquipamientoDTO();

                        equipamiento.setnomEquipamiento(nombre.getText());

                        if (getSeleccion(btnGPrecio).getText().equals(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.seleccion.espacio"))) {
                            equipamiento.setTipoPrecio(Constantes.PRECIO_POR_ESPACIO);
                        }
                        if (getSeleccion(btnGPrecio).getText().equals(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.seleccion.asistente"))) {
                            equipamiento.setTipoPrecio(Constantes.PRECIO_POR_ASISTENTE);
                        }
                        equipamiento.setPrecioDia(Double.parseDouble(precioDia.getText().trim()));
                        equipamiento.setPrecioHora(Double.parseDouble(precioHora.getText().trim()));
                        equipamiento.setInactivo(Constantes.ACTIVO);

                        equipamiento.setIdEquipamiento(objRemotoMantenimiento.altaEquipamiento(equipamiento));

                        auditoria.setObjeto(Constantes.EQUIPAMIENTO);
                        auditoria.setSujeto(idConectado);
                        auditoria.setPk(equipamiento.getIdEquipamiento().toString());
                        auditoria.setOperacion(Constantes.INSERCION);

                        objRemotoMantenimiento.altaAuditoria(auditoria);

                        JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.correcta"));

                        // Inicialización de los campos de texto del formulario
                        nombre.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.general.campo.nombre"));
                        precioDia.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.general.campo.preciodia"));
                        precioHora.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.general.campo.preciohora"));

                    } catch (GestorMantenimientoException gmE) {
                        JOptionPane.showMessageDialog(null,
                                gmE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.equipamiento.err.alta"),
                                JOptionPane.ERROR_MESSAGE);
                    } catch (RemoteException rE) {
                        JOptionPane.showMessageDialog(null,
                                rE.getMessage(), TDSLanguageUtils.getMessage("gmantenimiento.equipamiento.err.alta"),
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        }
    }

    /**
     * Este método devolverá el botón de radio seleccionado en un grupo de botones
     * @param grupo El grupo de botones al que pertenece el botón de radio seleccionado
     * @return el botón seleccionado
     */
    public static JRadioButton getSeleccion(ButtonGroup grupo) {
        for (Enumeration e = grupo.getElements(); e.hasMoreElements();) {
            JRadioButton b = (JRadioButton) e.nextElement();
            if (b.getModel() == grupo.getSelection()) {
                return b;
            }
        }
        return null;
    }

    /**
     * Permite salir del formulario
     * @return btnCancelar el botón
     */
    private JButton getBtnCancelar() {
        if (btnCancelar == null) {
            btnCancelar = new JButton();
            btnCancelar.setText(TDSLanguageUtils.getMessage("mantenimiento.equipamiento.alta.boton.cancelar"));
            btnCancelar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    btnCancelarActionPerformed(e);
                }
            });
        }
        return btnCancelar;
    }

    /**
     * Cierra el formulario
     * @param e evento lanzado desde el botón
     */
    private void btnCancelarActionPerformed(ActionEvent e) {
        dispose();
    }
}
